package com.dys.testgeneric04;

/**
 * @className: com.dys.testgeneric04.BaseGeneric
 * @description: 泛型类：<>里面是一个参数类型,类型是什么不确定,相当于一个占位。唯一可以确定的是它是一个引用数据类型,而非基本数据类型
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/01 下午8:07
 */
public class BaseGeneric<E> {
    String name;
    int age;
    E sex;

    public void a(E e) {
    }

    public void b(E[] e) {
    }
}

/**
 * 子类继承父类,父类指定泛型
 */
class SubGeneric extends BaseGeneric<Integer> {

}

/**
 * 父类没有指定类型,子类也必须是一个泛型类，那这个E的类型可以在创建子类对象的时候确定：
 *
 * @param <E> 参数类型
 */
class SubGeneric2<E> extends BaseGeneric<E> {

}

class BaseGenericTest {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        // 方式1: 当不指定泛型,默认就是Object类型
        BaseGeneric bg = new BaseGeneric();
        bg.name = "李思思";
        bg.age = 20;
        bg.sex = "男";
        bg.a("abc");
        bg.b(new String[]{"abc"});
        System.out.println(bg);

        // 方式2：指定泛型类型
        BaseGeneric<String> bg2 = new BaseGeneric<>();
        bg2.sex = "女";
        bg2.a("abc");
        bg2.b(new String[]{"abc"});

        // 继承关系: 当父类指定泛型后,子类就不需要再指定了,可以直接使用
        SubGeneric sg = new SubGeneric();
        sg.sex = 1;
        sg.a(12);

        // 继承关系：父类未指定泛型,在创建子类对象的时候,可以确定
        SubGeneric2<String> sb2 = new SubGeneric2<>();
        sb2.sex = "女";
        sb2.a("abc");
        sb2.b(new String[]{"abc"});
    }
}
